package com.tyrone.concurrent.basic;


/**
 * 双重检查锁（错误的）
 * new Integer 这个语句可以拆分三个步骤
 * number = new Integer
 * => memory = allocate();   【1】 内存分配
 * =>ctorInstance(memory)；  【2】初始化对象
 * => number = memory;    【3】3instance 指向memory
 * 【2】 和【3】有概率发生指令重排, 多线程的情况下，就会存在 线程B if(num == null) 是为false;
 * 但是这个时候的num 并没有被初始化
 *
 * 让程序正常执行的关键在于 number 可见性
 * 所以可以用violate 修饰 number
 * @author xieyl
 * @create 2021/12/1 17:56
 */
public class DoubleCheckLock {
    //错误的
//    private static Integer number;
    // 正确的
    private static  volatile Integer number;

    public static Integer getInteger() {
        if (number == null) {
            synchronized (DoubleCheckLock.class) {
                if (number == null){
                    number = new Integer(1);
                }
            }
        }
        return number;
    }

}
